#include <iostream>
#include <memory>

// Memento类存储Originator对象的内部状态
class Memento {
    friend class Originator;  				// 允许Originator访问私有成员
    int state;                				// 存储Originator的状态

    // 构造函数为私有，确保只有Originator能创建Memento
    Memento(int state): state(state) {}

public:
    ~Memento() {}  						// 析构函数
};

// 生成Originator类并在以后使用Memento对象来恢复其先前的状态
class Originator {
    int state;  							// Originator当前状态

public:
    // 构造函数，可初始化状态
    Originator(int state = 0): state(state) {}

    // 设置Originator的状态
    void set(int state) {
        this->state = state;
        std::cout << "State set to " << this->state << std::endl;
    }

    // 保存当前状态到Memento
    std::unique_ptr<Memento> saveToMemento() {
        return createMemento(state);
    }

    // 从Memento恢复状态
    void restoreFromMemento(const Memento& memento) {
        state = memento.state;
        std::cout << "State restored to " << state << std::endl;
    }

private:
    // 私有静态方法，用于创建Memento对象
    static std::unique_ptr<Memento> createMemento(int state) {
        return std::unique_ptr<Memento>(new Memento(state));
    }
};

// Caretaker负责保存和恢复Originator的Memento
class Caretaker {
    std::unique_ptr<Memento> memento;  			// 存储Memento的指针

public:
    // 保存Originator的状态
    void saveState(Originator& originator) {
        memento = originator.saveToMemento();
    }

    // 恢复Originator的状态
    void restoreState(Originator& originator) {
        if (memento) {
            originator.restoreFromMemento(*memento);
        }
    }
};

// 主函数
int main() {
    Originator originator(10);  				// 创建状态为10的Originator对象
    Caretaker caretaker;        				// 创建Caretaker对象

    caretaker.saveState(originator);  			// 保存当前状态
    originator.set(20);               			// 改变状态为20
    caretaker.restoreState(originator);  		// 恢复之前的状态

    return 0;
}